import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface';
// 从Ant Design Vue中导入表单接口相关类型

import type { VNode } from 'vue';
// 从Vue中导入虚拟节点类型

import type { ButtonProps as AntdButtonProps } from '/@/components/Button';
// 从'/@/components/Button'中导入ButtonProps，并将其重命名为AntdButtonProps

import type { FormItem } from './formItem';
// 从'./formItem'中导入FormItem类型

import type { ColEx, ComponentType } from './index';
// 从'./index'中导入ColEx和ComponentType类型

import type { TableActionType } from '/@/components/Table/src/types/table';
// 从'/@/components/Table/src/types/table'中导入TableActionType类型

import type { CSSProperties } from 'vue';
// 从Vue中导入CSSProperties类型

import type { RowProps } from 'ant-design-vue/lib/grid/Row';
// 从Ant Design Vue中导入Grid Row组件的RowProps类型

export type FieldMapToTime = [string, [string, string], string?][];
// FieldMapToTime类型定义，表示时间字段映射

export type Rule = RuleObject & {
  trigger?: 'blur' | 'change' | ['change', 'blur'];
};
// Rule类型定义，包括规则对象和触发器类型

export interface RenderCallbackParams {
  schema: FormSchema;
  values: Recordable;
  model: Recordable;
  field: string;
}
// RenderCallbackParams接口定义，包括用于回调的参数信息

export interface ButtonProps extends AntdButtonProps {
  text?: string;
}
// ButtonProps接口定义，继承自AntdButtonProps，同时包含text属性

export interface FormActionType {
  submit: () => Promise<void>;
  setFieldsValue: <T>(values: T) => Promise<void>;
  resetFields: () => Promise<void>;
  getFieldsValue: () => Recordable;
  clearValidate: (name?: string | string[]) => Promise<void>;
  updateSchema: (data: Partial<FormSchema> | Partial<FormSchema>[]) => Promise<void>;
  resetSchema: (data: Partial<FormSchema> | Partial<FormSchema>[]) => Promise<void>;
  setProps: (formProps: Partial<FormProps>) => Promise<void>;
  removeSchemaByFiled: (field: string | string[]) => Promise<void>;
  appendSchemaByField: (
    schema: FormSchema,
    prefixField: string | undefined,
    first?: boolean | undefined,
  ) => Promise<void>;
  validateFields: (nameList?: NamePath[]) => Promise<any>;
  validate: (nameList?: NamePath[]) => Promise<any>;
  scrollToField: (name: NamePath, options?: ScrollOptions) => Promise<void>;
}
// FormActionType接口定义，包含表单操作相关方法

export type RegisterFn = (formInstance: FormActionType) => void;
// RegisterFn类型定义，表示注册函数，用于注册表单实例

export type UseFormReturnType = [RegisterFn, FormActionType];
// UseFormReturnType类型定义，包含注册函数和表单操作类型

export interface FormProps {
  layout?: 'vertical' | 'inline' | 'horizontal';
  // 表单布局类型，可以是'vertical'、'inline'、'horizontal'

  model?: Recordable;
  // 表单的数据模型

  labelWidth?: number | string;
  // 表单项标签的宽度

  labelAlign?: 'left' | 'right';
  // 表单项标签的对齐方式，可以是'left'或'right'

  rowProps?: RowProps;
  // 表单的行属性配置

  submitOnReset?: boolean;
  // 重置表单时是否提交表单

  labelCol?: Partial<ColEx>;
  // 表单项标签的Col配置

  wrapperCol?: Partial<ColEx>;
  // 表单项内容的Col配置

  baseRowStyle?: CSSProperties;
  // 表单的基本行样式

  baseColProps?: Partial<ColEx>;
  // 表单的基本Col配置

  schemas?: FormSchema[];
  // 表单的配置规则

  mergeDynamicData?: Recordable;
  // 用于合并动态控件表单项的数据

  compact?: boolean;
  // 是否使用紧凑模式的搜索表单

  emptySpan?: number | Partial<ColEx>;
  // 空白行的占位配置

  size?: 'default' | 'small' | 'large';
  // 表单的组件大小

  disabled?: boolean;
  // 表单是否禁用

  fieldMapToTime?: FieldMapToTime;
  // 时间字段映射配置

  autoSetPlaceHolder?: boolean;
  // 是否自动设置占位符

  autoSubmitOnEnter?: boolean;
  // 是否在输入框上按回车键时自动提交表单

  rulesMessageJoinLabel?: boolean;
  // 是否将验证信息添加到标签上

  showAdvancedButton?: boolean;
  // 是否显示高级搜索按钮

  autoFocusFirstItem?: boolean;
  // 是否自动聚焦到第一个输入框

  autoAdvancedLine?: number;
  // 自动折叠高级搜索的行数

  alwaysShowLines?: number;
  // 是否总是显示行

  showActionButtonGroup?: boolean;
  // 是否显示操作按钮组

  resetButtonOptions?: Partial<ButtonProps>;
  // 重置按钮的配置选项

  submitButtonOptions?: Partial<ButtonProps>;
  // 提交按钮的配置选项

  actionColOptions?: Partial<ColEx>;
  // 操作列的配置选项

  showResetButton?: boolean;
  // 是否显示重置按钮

  showSubmitButton?: boolean;
  // 是否显示提交按钮

  resetFunc?: () => Promise<void>;
  // 重置函数

  submitFunc?: () => Promise<void>;
  // 提交函数

  transformDateFunc?: (date: any) => string;
  // 日期转换函数

  colon?: boolean;
  // 是否显示冒号
}
// FormProps接口定义，包含表单的各种配置属性

export interface FormSchema {
  field: string;
  // 字段名

  changeEvent?: string;
  // 内部值变化触发的事件名称，默认为'change'

  valueField?: string;
  // 与v-model绑定的变量名，默认值

  label: string | VNode;
  // 标签名或虚拟节点

  subLabel?: string;
  // 辅助文本

  helpMessage?:
    | string
    | string[]
    | ((renderCallbackParams: RenderCallbackParams) => string | string[]);
  // 帮助信息文本或函数

  helpComponentProps?: Partial<HelpComponentProps>;
  // HelpComponentProps的部分属性配置

  labelWidth?: string | number;
  // 标签宽度

  disabledLabelWidth?: boolean;
  // 是否禁用全局设置的标签宽度调整

  component: ComponentType;
  // 渲染组件类型

  componentProps?:
    | ((opt: {
        schema: FormSchema;
        tableAction: TableActionType;
        formActionType: FormActionType;
        formModel: Recordable;
      }) => Recordable)
    | object;
  // 组件属性配置或函数

  required?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);
  // 是否必填或函数

  suffix?: string | number | ((values: RenderCallbackParams) => string | number);
  // 后缀信息

  rules?: Rule[];
  // 验证规则

  rulesMessageJoinLabel?: boolean;
  // 是否将验证信息添加到标签上

  itemProps?: Partial<FormItem>;
  // FormItem的部分属性配置

  colProps?: Partial<ColEx>;
  // 外部Col的部分属性配置

  defaultValue?: any;
  // 默认值

  isAdvanced?: boolean;
  // 是否高级搜索

  span?: number;
  // 列占位数量

  ifShow?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);
  // 是否显示或函数

  show?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);
  // 是否显示或函数

  render?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string;
  // 渲染内容

  renderColContent?: (renderCallbackParams: RenderCallbackParams) => VNode | VNode[] | string;
  // 渲染Col内容

  renderComponentContent?:
    | ((renderCallbackParams: RenderCallbackParams) => any)
    | VNode
    | VNode[]
    | string;
  // 渲染组件内容

  slot?: string;
  // 自定义插槽，用于FormItem

  colSlot?: string;
  // 自定义插槽，类似于renderColContent

  dynamicDisabled?: boolean | ((renderCallbackParams: RenderCallbackParams) => boolean);
  // 是否动态禁用或函数

  dynamicRules?: (renderCallbackParams: RenderCallbackParams) => Rule[];
  // 动态验证规则
}
// FormSchema接口定义，包含表单项的各种配置属性

export interface HelpComponentProps {
  maxWidth: string;
  // 最大宽度

  showIndex: boolean;
  // 是否显示序号

  text: any;
  // 文本内容

  color: string;
  // 文本颜色

  fontSize: string;
  // 字体大小

  icon: string;
  // 图标

  absolute: boolean;
  // 是否绝对定位

  position: any;
  // 定位属性
}
// HelpComponentProps接口定义，包含帮助组件的属性配置
